﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LM.InterfacesFabricas.DTOs;
using LM.InterfacesFabricas.Interfaces.Servicos;
using LM.InterfacesFabricas.Utilidades;
using LM.Negocio.Objetos;
using LM.Negocio.Validadores;
using LM.Repositorios;
using LM.Repositorios.Interfaces;

namespace LM.Servicos
{
    public class ServicoDeEndereco : IServicoDeEndereco
    {
        public void Cadastre( DtoEndereco endereco )
        {
            var repositorioDeEndereco = FabricaDeRepositorios.Crie<IRespositorioDeEndereco>();
            var validadorDeEndereco = new ValidadorDeEndereco( repositorioDeEndereco);
            var enderecoObjeto = ConversorDeObjetos.Copie<Endereco>( endereco );

            validadorDeEndereco.ValideCadastro( enderecoObjeto );

            repositorioDeEndereco.Cadastre( enderecoObjeto );
        }

        public void Atualize( DtoEndereco endereco )
        {
            var repositorioDeEndereco = FabricaDeRepositorios.Crie<IRespositorioDeEndereco>();
            var validadorDeEndereco = new ValidadorDeEndereco( repositorioDeEndereco );
            var enderecoObjeto = ConversorDeObjetos.Copie<Endereco>( endereco );

            validadorDeEndereco.ValideAtualizacao( enderecoObjeto );

            repositorioDeEndereco.Atualize( enderecoObjeto );
        }

        public void Exclua( int codigo )
        {
            var repositorioDeEndereco = FabricaDeRepositorios.Crie<IRespositorioDeEndereco>();
            var validadorDeEndereco = new ValidadorDeEndereco( repositorioDeEndereco );
            var enderecoObjeto = ConversorDeObjetos.Copie<Endereco>( repositorioDeEndereco.Consulte( codigo ) );

            validadorDeEndereco.ValideExclusao( enderecoObjeto );

            repositorioDeEndereco.Exclua( enderecoObjeto );
        }

        public DtoEndereco Consulte( int codigo )
        {
            var enderecoObjeto = FabricaDeRepositorios.Crie<IRespositorioDeEndereco>().Consulte( codigo );

            return ConversorDeObjetos.Copie<DtoEndereco>( enderecoObjeto );
        }

        public IList<DtoEndereco> ConsulteTodos()
        {
            return ConversorDeObjetos.Copie<DtoEndereco, Endereco>( FabricaDeRepositorios.Crie<IRespositorioDeEndereco>().ConsulteTodos() );
        }


        public DtoEndereco Valide(DtoEndereco endereco)
        {
            throw new NotImplementedException();
        }
    }
}
